import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.*;

public class StreamIntermediateMethod {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 19));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 17));
        list.add(new Student("张麻子", 33));

        Student[] students = list.stream().toArray(s->new Student[s]);
        //以上代码简化为如下:
        Student[] students1 = list.stream().toArray(Student[]::new);

        System.out.println(Arrays.toString(students));
        System.out.println(Arrays.toString(students1));
    }
}
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 19));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 17));
        list.add(new Student("张麻子", 33));

        Map<String,Integer> map = list.stream().collect(Collectors.toMap(s-> s.getName(), s-> s.getAge()));
        System.out.println(map);
    }
}*/

/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 19));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 17));
        list.add(new Student("张麻子", 33));

        //对一下代码进行解读: 先得到该集合的流，再进行筛选出年龄大于18的元素，
        // 最后再将这些集合中的元素收集到 Set 系列集合中。
        Set <Student> set = list.stream().filter(s->s.getAge() > 18).collect(Collectors.toSet());
        System.out.println(set);
    }
}*/
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 19));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 17));
        list.add(new Student("张麻子", 33));

        //对以下代码进行解读：先得到该集合的流，再筛选开头为“张”的名字，得到一个新流，再收集到 List 系列集合中。
        List<Student> list1 =  list.stream().filter(s->s.getName().startsWith("张")).collect(Collectors.toList());
        System.out.println(list1);
    }
}*/

/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 19));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 17));
        list.add(new Student("张麻子", 33));

        Student s1 = list.stream().max((o1, o2) -> o1.getAge() - o2.getAge()).get();
        System.out.println("最大年龄为："+s1.getAge());

        Student s2 = list.stream().min((o1, o2) -> o1.getAge() - o2.getAge()).get();
        System.out.println("最小年龄为："+s2.getAge());
    }
}*/
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));

        List<Student> list1 = new ArrayList<>();
        list1.add(new Student("李麻子",23));
        System.out.println(Stream.concat(list.stream(), list1.stream()).count());
    }
}*/

/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));
        list.add(new Student("张三",19));

        //解读以下代码: 先获取该集合中的流，然后调用 distinct() 方法，但是该流中的元素是自定义，
        //所以希望内容一样就认为重复，这就需要重写 hashCode() 与 equals() 方法。
        //去重后，返回一个新流。
        list.stream().distinct().forEach(System.out::println);
    }
}*/
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));

        //解读以下代码: 先得到该集合的流，然后调用 map() 中间方法，
        //将对应的元素进行加工，简单的来说就是，将原先的元素加工成自己想要的形式，
        //以下就是将学生类对象加工成字符串，["张三",19] -> "张三"，每一个元素都是一一对应、映射的。
        list.stream().map(s->s.getName()).forEach(System.out::println);
    }
}*/
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));

        //对一下代码进行解读：先得到该集合的流，然后用 skip(2) 中间方法，跳过前面2个元素，
        //得到的新流中包含后面两个元素，然后就进行遍历了。
        list.stream().skip(2).forEach(System.out::println);
    }
}*/

/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));

        //对一下代码进行解读：先获取该集合的流，然后用 limit(2) 中间方法，获取前面2个元素，
        //返回新流，接着对新流进行遍历输出元素
        list.stream().limit(2).forEach(System.out::println);
    }
}*/
/*    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三",19));
        list.add(new Student("李四",22));
        list.add(new Student("王五",17));
        list.add(new Student("张麻子",33));

        //解读以下代码：首先先利用 stream() 方法来获取该集合的流，然后用 sorted() 方法，由于是自定义类型的对象，
        //默认的 sorted() 方法是搞不定，所以需要重写方法，因此可以接入这个匿名内部类来重写内部的具体方法，
        //排完序之后会得到一个新的流，然后经过 forEach 方法来遍历该流中的数据。
        list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(s-> System.out.println(s));
        //以上代码话可以继续简化,效果是一样的
        System.out.println("--------------------------------------------------------------------");
        list.stream().sorted((o1, o2)-> o1.getAge() - o2.getAge()).forEach(System.out::println);
    }
}*/
/*    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        Collections.addAll(list,"张三","李四","王五","张麻子");
        //对一下代码解读:首先用 stream() 得到了该集合的流，
        //然后用 filter() 用于对流中的数据进行过滤，也可以理解成筛选字符串中带有“张”的,返回新流，
        //该新流中都是含“张”的字符串，接着把流中的数据进行用 forEach() 方法进行遍历。

        *//*list.stream().filter(s -> s.contains("张")).forEach(s-> System.out.println(s));*//*
        //对以上代码稍微简化，如以下：
        list.stream().filter(s -> s.contains("张")).forEach(System.out::println);
    }
}*/
